package com.njbw.design_pattern.created.singleton;

/**
 * 静态内部类实现单例模式
 * 静态内部类方式在 Singleton 类被加载时并不会立即实例化，而是在第一次调用 getInstance() 方法时才会加载 SingletonHolder 类，从而创建 Singleton 的实例。
 * 这种方式利用了类加载的延迟性和线程安全性，确保了单例实例的唯一性和延迟初始化。
 * 这种方式不仅实现了延迟加载，还利用了 Java 类加载的线程安全特性，避免了显式的同步开销，从而提高了性能。
 * <p>/>
 * 适用场景：需要延迟加载且对性能有较高要求的场景。
 * <p/>
 * 这种方式是最推荐的单例模式实现方式，因为它既支持延迟加载，又能确保线程安全，同时代码简洁明了。
 *
 * @author huang hou chun
 */
public class InnerSingleton {

    // 1.构造器私有化
    private InnerSingleton() {
    }

    // 2.提供一个方法获取单例对象
    public static InnerSingleton getInstance() {
        return SingletonHolder.INSTANCE;
    }

    // 3.定义内部类来持有实例
    // 特性，类加载时机 ----> 一个类会在第一次主动使用的时候被加载
    // 实例会在内部类（调用 getInstance 方法的时候）会创建
    // 静态内部类在外部类被加载时并不会立即加载，而是在第一次访问 SingletonHolder 类时才会加载
    // 这种方式利用了类加载的延迟性和线程安全性，确保了单例实例的唯一性和延迟初始化
    private static class SingletonHolder {

        private static final InnerSingleton INSTANCE = new InnerSingleton();
    }
}
